/**
 * @param {number[]} nums
 * @return {number}
 */
var triangleNumber = function (nums) {
  // 先对数组进行排序
  nums.sort((a, b) => a - b);
  let count = 0;
  const n = nums.length;

  // 从最大的元素开始作为第三条边
  for (let i = 2; i < n; i++) {
    let left = 0; // 指向最小的元素
    let right = i - 1; // 指向中间的元素

    // 使用双指针寻找符合条件的组合
    while (left < right) {
      // 如果两边之和大于第三边，则说明从left到right的所有元素都能与i组成三角形
      if (nums[left] + nums[right] > nums[i]) {
        count += right - left;
        right--; // 尝试更小的中间元素
      } else {
        left++; // 需要更大的最小元素
      }
    }
  }

  return count;
};

// 测试案例
console.log(triangleNumber([2, 2, 3, 4])); // 输出: 3
console.log(triangleNumber([4, 2, 3, 4])); // 输出: 4
